Cloud Vision APIを使ってPDFファイルからテキストを抽出してみる
Google Cloud Platformで利用できるVision AIというサービスは、機械学習を使用した画像認識が行えます。
AutoML Vision
という独自のカスタム機械学習モデルのトレーニングを自動化できるプロダクトと、Vision API
という事前トレーニング済み機械学習モデルが使われた画像分析をREST API や RPC APIで行えるプロダクトがあります。
PDFの中身を読み取ってテキストデータを取得するということをやる機会があるので、Vision API
を使用してどこまで読み取りができるのか確認していきたいと思います。
Vision APIは画像からテキストを検出、抽出できるのですが、
TEXT_DETECTION
とDOCUMENT_TEXT_DETECTION
という2つの光学式文字認識(OCR)をサポートするアノテーション機能があります。
DOCUMENT_TEXT_DETECTIONは、
高密度のテキストやドキュメントに応じてレスポンスが最適化され、ページ、ブロック、段落、単語、改行の情報が JSON に含まれます。
ということができる機能で、手書き入力の抽出とファイル(PDF/TIFF)からのテキスト抽出はこちらを使う必要があるようです。
Doc: ファイル内のテキストを検出する(PDF/TIFF)
準備
まず前提として、Google Cloudのアカウント、プロジェクトの作成 が必要ですので用意しておきます。
その上で、
- プロジェクト内で課金が有効になっていること
- Cloud Vision API を有効にする
- サービスアカウントの作成(後述※1)
- サービスアカウントキーの作成(後述※2)
が必要です。
サービスアカウントの作成※1
Cloud Console で [サービス アカウントの作成] ページに移動します。このページで対象のプロジェクトを選択しましょう。
サービス アカウント名とサービス アカウントの説明を入力して続行します。
Vision API 自体にはサービス アカウントが必要ですが、使用するロールを作成する必要はありません。
と説明があり、省略することも可能です。
ただし、今回使用するAPIでは
出力のために指定する Cloud Storage バケットへのアクセス権(roles/editor または roles/storage.objectCreator 以上の役割)が付与されている必要
なので、
上記のように編集者ロールを付与しておきます。
ユーザーにこのサービス アカウントへのアクセスを許可 も省略可能です。 今回は必要ありませんので省略して完了をクリックします。
サービスアカウントキーの作成※2
サービスアカウントを作成後、作成したサービスアカウントのメールアドレスをクリックします。
鍵を追加
のボックスにある新しい鍵を作成
をクリックします
キータイプは推奨のJSONにし、作成します。
秘密鍵がパソコンに保存されました
というダイアログと共に、JSONキーファイルがパソコンにダウンロードされます。
JSONキーファイルの保存場所は適時変更します。
最後に、 GOOGLE_APPLICATION_CREDENTIALS
という環境変数にJSONキーファイルのパスを設定します。
(MAC, Linux)
export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
(Win)
set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH
$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
KEY_PATH をサービス アカウント キーが含まれる JSON ファイルのパスに置き換えます
Vision APIを実行してみる
Cloud Storage に保存されているファイルにしか実行できないようなので、抽出したいPDFファイルはあらかじめアップロードしておきます
PDFからテキストを抽出する場合、
files:asyncBatchAnnotate
という関数を使用してリクエストする(非同期で処理される)- サービスアカウントによる認証を行う
- 出力のために指定するCloud Storageバケットへのアクセス権(roles/editor または roles/storage.objectCreator 以上の役割)が付与されている
- サービスアカウントによる認証を行う
必要があります。
Method: files.asyncBatchAnnotate
Pythonのサンプルで実行
RESTやコマンドラインでの実行サンプルにいろんな言語で実行できるサンプルコードがあるので、これを使って実行してみます。
ライブラリのインストール
pip install google-cloud-storage pip install --upgrade google-cloud-vision
実行結果
def async_detect_document(gcs_source_uri, gcs_destination_uri): """OCR with PDF/TIFF as source files on GCS""" import json import re from google.cloud import vision from google.cloud import storage ~~~~~~~省略~~~~~~~ source_uri = 'gs://<<バケット名>>/<<ファイルパス>>' destination_uri = 'gs://<<バケット名>>/<<出力先のパス>>/' async_detect_document(source_uri, destination_uri)
サンプルコードに書かれていた関数を上記のように実行してみました。
上記の請求書を読み取るように指定した結果、
gcs_destination_uri
に指定したパスに結果のjsonファイルが格納され,読み取れたテキストが出力されます。
読み取った内容のフォーマットですが、
{ "pages": [ { object (Page) } ], "text": string }
pages[]はOCRで検出されたページの一覧、textはページで検出されたUTF-8テキスト が格納されます。
TextAnnotation のページに詳しく記載されています。
jsonの中身の例)
かなりの読み取り精度だと思います。
pagesオブジェクトの中をより深く探索していくと、読み取ったブロックの情報も格納されているので、
その内容を使って読み取った箇所を線で囲ってみる
というのも試していこうと思います。